package fr.efrei.musicpliz.util;

import fr.efrei.musicpliz.dto.CompteDto;
import fr.efrei.musicpliz.entity.Artiste;
import fr.efrei.musicpliz.entity.Authority;
import fr.efrei.musicpliz.entity.ClientParticulier;
import fr.efrei.musicpliz.entity.ClientProfessionnel;
import fr.efrei.musicpliz.entity.Compte;
import fr.efrei.musicpliz.entity.Groupe;
import fr.efrei.musicpliz.enums.CompteTypeEnum;
import fr.efrei.musicpliz.enums.RoleEnum;

public class DtoHelper {
	// TODO use polymorphism
	public static CompteDto getDtoForCompte(Compte cpt) {

		if (cpt instanceof Artiste) {
			Artiste art = (Artiste) cpt;
			return new CompteDto(CompteTypeEnum.ARTISTE, art.getId(),
					art.getNom(), art.getAdresse(), art.getCodePostal(),
					art.getVille(), art.getNumero(), art.getMail(),
					art.getPassword(), art.getNaissance(), art.getPrenom(),
					art.getNomScene(), null, null, art.getInstrument(),
					art.getTypeMusique(), art.getMaterial(), art.getPtsExp(),
					art.getPrixHeure(), art.getPrixEncheres());

		} else if (cpt instanceof Groupe) {
			Groupe grp = (Groupe) cpt;
			return new CompteDto(CompteTypeEnum.GROUPE, grp.getId(),
					grp.getNom(), grp.getAdresse(), grp.getCodePostal(),
					grp.getVille(), grp.getNumero(), grp.getMail(),
					grp.getPassword(), grp.getNaissance(), null, null, null,
					null, grp.getInstrument(), grp.getTypeMusique(),
					grp.getMaterial(), grp.getPtsExp(), grp.getPrixHeure(),
					grp.getPrixEncheres());

		} else if (cpt instanceof ClientParticulier) {
			ClientParticulier cpa = (ClientParticulier) cpt;
			return new CompteDto(CompteTypeEnum.CLIENT_PARTICULIER,
					cpa.getId(), cpa.getNom(), cpa.getAdresse(),
					cpa.getCodePostal(), cpa.getVille(), cpa.getNumero(),
					cpa.getMail(), cpa.getPassword(), cpa.getNaissance(),
					cpa.getPrenom(), null, null, null, cpa.getInstrument(),
					null, null, 0, 0, 0);

		} else {
			ClientProfessionnel cpr = (ClientProfessionnel) cpt;
			return new CompteDto(CompteTypeEnum.CLIENT_PROFESSIONNEL,
					cpr.getId(), cpr.getNom(), cpr.getAdresse(),
					cpr.getCodePostal(), cpr.getVille(), cpr.getNumero(),
					cpr.getMail(), cpr.getPassword(), cpr.getNaissance(), null,
					null, cpr.getTypeResto(), cpr.getDescription(), null, null,
					null, 0, 0, 0);
		}
	}
	
	public static Artiste getArtisteForDto(CompteDto dto) {
		Artiste art = new Artiste(dto.getNom(), dto.getPrenom(),
				dto.getNomScene(), dto.getAdresse(), dto.getCodePostal(),
				dto.getVille(), dto.getNumero(), dto.getTypeMusique(),
				dto.getInstrument(), dto.getMaterial(), dto.getMail(),
				dto.getPassword(), dto.getNaissance(), dto.getPtsExp(), dto.getPrixHeure(),
				dto.getPrixEncheres());

		// new compte?
		if (dto.getId() == null || dto.getId() == 0) {
			art.getAuthorities().add(new Authority(RoleEnum.ROLE_USER, art));
		} else {
			art.setId(dto.getId());
		}
		return art;
	}
	
	public static Groupe getGroupeForDto(CompteDto dto) {
		Groupe grp = new Groupe(dto.getNom(), dto.getAdresse(),
				dto.getCodePostal(), dto.getVille(), dto.getNumero(),
				dto.getTypeMusique(), dto.getInstrument(),
				dto.getMaterial(), dto.getMail(), dto.getPassword(),
				dto.getNaissance(), dto.getPtsExp(), dto.getPrixHeure(),
				dto.getPrixEncheres());

		// new compte?
		if (dto.getId() == null || dto.getId() == 0) {
			grp.getAuthorities().add(new Authority(RoleEnum.ROLE_USER, grp));
		} else {
			grp.setId(dto.getId());
		}
		return grp;
	}
	
	public static ClientProfessionnel getClientProfessionnelForDto(CompteDto dto) {

		ClientProfessionnel cpa = new ClientProfessionnel(dto.getNom(),
				dto.getTypeResto(), dto.getAdresse(), dto.getCodePostal(),
				dto.getVille(), dto.getNumero(), dto.getDescription(),
				dto.getMail(), dto.getPassword(), dto.getNaissance());

		// new compte?
		if (dto.getId() == null || dto.getId() == 0) {
			cpa.getAuthorities().add(new Authority(RoleEnum.ROLE_USER, cpa));
		} else {
			cpa.setId(dto.getId());
		}
		return cpa;
	}
	
	public static ClientParticulier getClientParticulierForDto(CompteDto dto) {

		ClientParticulier cpr = new ClientParticulier(dto.getNom(),
				dto.getPrenom(), dto.getAdresse(), dto.getCodePostal(),
				dto.getVille(), dto.getNumero(), dto.getInstrument(),
				dto.getMail(), dto.getPassword(), dto.getNaissance());

		// new compte?
		if (dto.getId() == null || dto.getId() == 0) {
			cpr.getAuthorities().add(new Authority(RoleEnum.ROLE_USER, cpr));
		} else {
			cpr.setId(dto.getId());
		}
		return cpr;
		
	}
}
